#include <iostream>
using namespace std;

/*

	问题1：如何确定返回值类型和形参？
	答案：依据运算表达式反推
		  Cat c3=c1+5; //人类的思维习惯
		  转换成函数调用的写法(两种转换方法)
		    Cat c3=c1.operator+(5);  //成员函数
			Cat c3=operator+(c1,5);  //友元函数
		  
		  Cat c4=8+c2; //人类的思维习惯
		  转换成函数调用的写法(两种转换方法)
			Cat c4=8.operator+(c2);  //成员函数，搞笑吧，8根本就不是猫的对象，无法调用成员函数，函数调用的思维来写
		    Cat c4=operator+(8,c2);  //友元函数
	运算符重载有两种表现形式，目前我们只学习了一种
	      第一种：运算符重载为成员函数
	      第二种：运算符重载为友元函数
		    绝大部分情况下，两种写法都可以，但是某些特殊情况(无法使用类对象调用的)，只能重载为友元函数
*/

class Cat
{
public:
	Cat(int _age=0)
	{
		age=_age;
	}

	//猫类里面重载加法运算，让猫具备做加法的能力
	int operator+(Cat &other)
	{
		cout<<"加法重载版本1被调用了"<<endl;
		return this->age+other.age;
	}
	Cat operator+(int n)
	{
		cout<<"加法重载版本2被调用了"<<endl;
		Cat temp; 
		temp.age=this->age+n;
		return temp;
	}
	friend Cat operator+(int n,Cat &other);
private:
	int age;
};

Cat operator+(int n,Cat &other)
{
	cout<<"加法重载为猫类的友元函数被调用了"<<endl;
	Cat temp;
	temp.age=n+other.age;
	return temp;
}

int main()
{
	Cat c1(5);
	Cat c2(7);
	

	//if(c1>c2)
	
	//写法1：人类的思维习惯
	//int result=c1+c2;
	//写法2：函数调用的思维来写
	//int result=c1.operator+(c2);
	//cout<<"c1+c2 is: "<<result<<endl;
	
	//写法1：人类的思维习惯
	//Cat c3=c1+5;
	//Cat c4=8+c2;
	//写法2：函数调用的思维来写
	Cat c3=c1.operator+(5);
	Cat c4=operator+(8,c2);
}